const {
  NAME_OR_PASSWORD_IS_REQUIRED,
  NAME_IS_ALREADY_EXISTS,
} = require("../config/error.constants")
const userService = require("../service/user.service")
const md5Encryption = require("../utils/md5.encryption")

// 验证用户是否有效
const userVerify = async (ctx, next) => {
  // 2.1.2 这里判断用户是否已经存在/是否为空，才能进行下一步
  // 是否为空
  const { name, password } = ctx.request.body

  if (!name || !password) {
    // ctx.body = {
    //   code: -1001,
    //   message: "用户名或密码不能为空",
    // }
    // 在 config 中定义错误的常量 error.constants.js
    return ctx.app.emit("error", NAME_OR_PASSWORD_IS_REQUIRED, ctx)
  }

  // 数据库中用户名是否存在，在 userService 类中编写查询的方法
  const userName = await userService.findUserByName(name)
  // [{id:xx, name:xx}]
  // console.log(userName)
  // @ts-ignore
  if (userName.length) {
    // ctx.body = {
    //   code: -1002,
    //   message: "用户名已经被占用了",
    // }
    // 将错误的事件发出，在 handle.errors.js 中监听到
    return ctx.app.emit("error", NAME_IS_ALREADY_EXISTS, ctx)
  }

  // 执行下一个中间件
  await next()
}

// 对密码进行加密处理
const pwdEncryption = async (ctx, next) => {
  const { password } = ctx.request.body

  //对密码进行加密处理，使用的是 md5 的加密算法
  ctx.request.body.password = md5Encryption(password)

  await next()
}

module.exports = { userVerify, pwdEncryption }
